package com.girl.aspact;


import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;


@Aspect
@Component
public class HttpAspact {

    /*使用同一的日志处理器，包是org.slf4j，这个包是spring提供的一个处理器
     */
    private final static Logger log = LoggerFactory.getLogger(HttpAspact.class);

    /**
     * AOP是一种编程范式，是一种编程思想，叫面向切面编程，可以将面向对象建立的工程进行分析之后进行横切，
     * 在一定得层面进行一些处理操作
     * OOP是面向对象编程
     * POP是面向过程编程
     */

    @Pointcut("execution(public * com.girl.*.*(..))")
    public void log(){
        /**
         * 使用@pointCut注解可以定义一个公用的拦截，然后在下面的这些方法中直接调用log方法就可以实现拦截，避免一直重复写execution一长串
         */
    }

    @Before("log()")
    public void doBefore(JoinPoint joinPoint){
        /**
         * 常用日志处理方式，获取url、method、ip、类方法、参数等信息
         */
        ServletRequestAttributes context = (ServletRequestAttributes)RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = context.getRequest();
        //url
        log.info("url{}",request.getRequestURI());
        //method
        log.info("method{}",request.getMethod());
        //ip
        log.info("ip{}",request.getRemoteAddr());
        //类方法
        log.info("class_method",joinPoint.getSignature().getDeclaringTypeName()+"."+joinPoint.getSignature().getName());
        //参数
        log.info("args{}",joinPoint.getArgs());
    }

    @After("log()")
    public void doAfter(){
        System.out.println(222222);
    }

    @AfterReturning(returning = "object",pointcut = "log()")
    public void doAfterReturning(Object object){
        log.info("response{}",object.toString());
    }

}
